package mint.modules.symbol;

import java.util.Formatter;
import mint.modules.generator.FormalParameterNode;
import mint.modules.generator.MethodDeclarationNode;
import mint.modules.type.Type;

public class MethodSymbol extends Symbol {
	private MethodDeclarationNode node;
	private SymbolModifier modifier;

	public MethodSymbol(MethodDeclarationNode methodNode) {
		super(methodNode.getName());
		node = methodNode;
		
		String modifierText = node.getModifier();
		
		if (modifierText.equals("public"))
		{
			modifier = SymbolModifier.publicModifier;
		}
		else if (modifierText.equals("private"))
		{
			modifier = SymbolModifier.privateModifier;
		}
		else if (modifierText.equals("protected"))
		{
			modifier = SymbolModifier.protectedModifier;
		}
		else
			modifier = SymbolModifier.publicModifier;		
	}
	
	public Type getType()
	{
		return node.getType();
	}
	
	public SymbolModifier getModifier()
	{
		return modifier;
	}
	
	public int getParameterListSize()
	{
		return node.getParameterListSize();
	}
	
	public FormalParameterNode getParameter(int i)
	{
		return node.getParameter(i);
	}

	@Override
	public SymbolType getSymbolType() {
		return SymbolType.Method;
	}

	@Override
	public void print(Formatter output, int tabSize) {
		for (int i = 1; i <= tabSize; i++)
			output.format("\t");
		output.format("Method: %s %s(", node.getModifier(), node.getName());
		
		for(int i = 0; i < node.getParameterListSize(); i++)
		{
			FormalParameterNode param = node.getParameter(i);
			Symbol symbol = node.searchSymbol(param.getName(), node.getContainerClass(), false);
			
			if (symbol.getSymbolType() == SymbolType.Parameter)
			{
				symbol.print(output, 0);
			}
			
			if (i < node.getParameterListSize() - 1)
				output.format(", ");
		}
		output.format(") : %s\n", node.getType().getName());		
	}

}
